package com.gl.buscaminas;

/**
 * 
 * @author Omar Moreno 04/03/2012
 *
 */
public class Tablero {

	private Casillero[][] casilleros;
	private int casillerosDestapados;
	private String estado;
	private int totalBombas;
	private int totalCasilleros;
	private FabricaCasilleros fabricaCasilleros;

	public Tablero(int filas, int columnas) {
		this.casilleros = new Casillero[filas][columnas];
		this.fabricaCasilleros = FabricaCasilleros.obtenerInstancia();
		this.totalCasilleros = filas * columnas;
		this.casillerosDestapados = 0;
		this.estado = EstadosJuego.NO_INICIADO;
	}

	public void cambiarEstadoJuego(String estado) {
		this.estado = estado;
	}

	public int getCasillerosDestapados() {
		return casillerosDestapados;
	}

	public void setCasillerosDestapados(int casillerosDestapados) {
		this.casillerosDestapados = casillerosDestapados;
	}

	public int getTotalBombas() {
		return totalBombas;
	}

	public void setTotalBombas(int totalBombas) {
		this.totalBombas = totalBombas;
	}

	public Casillero[][] getCasilleros() {
		return casilleros;
	}

	public void setCasilleros(Casillero[][] casilleros) {
		this.casilleros = casilleros;
	}

	private int calcularBombasAdyacentes(int fila, int columna) {
		int bombas = 0;
		for (int i = -1; i <= 1; i++) {
			for (int j = -1; j <= 1; j++) {
				if (fila + i < this.casilleros.length
						&& columna + j < this.casilleros.length
						&& fila + i >= 0 && columna + j >= 0) { // no esta fuera
																// del tablero
					if (this.casilleros[fila + i][columna + j].isBomba()) {
						bombas++;
					}
				}
			}

		}
		return bombas;
	}

	public void inicializarTablero() {
		for (int i = 0; i < this.casilleros.length; i++) {
			for (int j = 0; j < this.casilleros[i].length; j++) {
				if (this.casilleros[i][j] == null) { // casillero sin bomba
					Casillero casillero = this.fabricaCasilleros
							.crearCasillero(i, j, false);
					this.casilleros[i][j] = casillero;
				}
			}
		}
		for (int i = 0; i < this.casilleros.length; i++) {
			for (int j = 0; j < this.casilleros[i].length; j++) {
				Casillero casillero = this.casilleros[i][j];
				if (!casillero.isBomba()) {
					casillero.setContadorBombasAdyacentes(this
							.calcularBombasAdyacentes(i, j));
					this.casilleros[i][j] = casillero;
				}
			}
		}
		this.estado = EstadosJuego.JUGANDO;
	}

	public void ponerBomba(int fila, int columna) {
		Casillero casillero = this.fabricaCasilleros.crearCasillero(fila,
				columna, true);
		this.casilleros[fila][columna] = casillero;
		this.totalBombas += 1;
	}

	public void destapar(int fila, int columna) {
		Casillero casillero = this.casilleros[fila][columna];
		casillero.destapar(this);
	}

	public String obtenerEstadoTablero() {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < this.casilleros.length; i++) {
			for (int j = 0; j < this.casilleros[i].length; j++) {
				Casillero casillero = this.casilleros[i][j];
				if (casillero != null) {
					if (casillero.isDestapado()) {
						sb.append(casillero.getContadorBombasAdyacentes());
					} else {
						sb.append("?");
					}
				}
			}
			sb.append("\n");
		}
		return sb.toString();
	}

	public String obtenerTableroInicializado() {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < this.casilleros.length; i++) {
			for (int j = 0; j < this.casilleros[i].length; j++) {
				Casillero casillero = this.casilleros[i][j];
				sb.append(casillero.getContadorBombasAdyacentes());
			}
			sb.append("\n");
		}
		return sb.toString();
	}

	public String obtenerEstadoJuego() {
		if (this.totalCasilleros == this.totalBombas
				+ this.casillerosDestapados
				&& this.totalCasilleros != this.totalBombas) {
			this.estado = EstadosJuego.GANASTE;
		}
		return this.estado;
	}

}
